#pragma once

// 默认宏（若未通过编译器/构建系统提供则设为 0）
#ifndef CFG_HAVE_STD_EXPECTED
#define CFG_HAVE_STD_EXPECTED 0
#endif
#ifndef CFG_HAVE_STD_SPAN
#define CFG_HAVE_STD_SPAN 0
#endif
#ifndef CFG_HAVE_STD_FORMAT
#define CFG_HAVE_STD_FORMAT 0
#endif
#ifndef CFG_HAVE_STD_PRINT
#define CFG_HAVE_STD_PRINT 0
#endif
#ifndef CFG_HAVE_STD_RANGES
#define CFG_HAVE_STD_RANGES 0
#endif
#ifndef CFG_HAVE_STD_VIEW
#define CFG_HAVE_STD_VIEW 0
#endif

// 统一使用 contrib/stlcompat 提供的轻量兼容层
#include <stlcompat/expected.h>
#include <stlcompat/print.h>
#include <stlcompat/span.h>
#include <stlcompat/view.h>

namespace cfg
{
// expected 家族：类型别名与辅助符号
template <class T, class E>
using expected = kp::expected<T, E>;

template <class E>
using unexpected_t = kp::unexpected_t<E>;

template <class E>
inline unexpected_t<E>
unexpected(E e)
{
    return kp::unexpected<E>(std::move(e));
}

using unexpect_t = kp::unexpect_t;
using kp::unexpect;

template <class E>
using bad_expected_access = kp::bad_expected_access<E>;

// span 家族：dynamic_extent 与模板别名
using kp::dynamic_extent;

template <class T, std::size_t Extent = dynamic_extent>
using span = kp::span<T, Extent>;

// 视图/适配器：直接重导出
using kp::as_view;
using kp::transform;
namespace views = kp::views;

// 打印（可选）：重导出 kp::print/println
using kp::print;
using kp::println;
} // namespace cfg
